שיעור מס' : משתנים מורכבים מערכי תאים מערך תאים הוא מערך שבו כל איבר בעצמו הוא מערך מסוג ומימדים כלשהם. לדוגמא מערך עמודה: מס' איבר 2 3 4 5 תוכן סקלר נומרי סקלר לוגי מטריצה נומרית 2 3 6 מערך-תאים (שורה אחת, 3 איברים) עם האיברים הבאים: מערך ריק סוגי המשתנים בדוגמא למעלה אינם מחייבים, וגם אחרי שניתן ערך לאיבר מסוים, ניתן להחליפו בערך מסוג אחר ומימד אחר. לדוגמא ניתן להחליף את מחרוזת התווים בתא השלישי במערך נומרי תלת-ממדי. בדרך כלל משתמשים במערכי תאים לצורך ארגון נתונים מאותו סוג, אבל בממדים שונים. לדוגמא: מחרוזות תווים: רשימה של שמות (כל אחד באורך אחר). מטריצות נומריות: נתונים שנקראו מקבצים שונים, בדרך כלל עם אותו מספר עמודות אבל עם מספר שורות שונה. יצירת מערכי תאים וטיפול בהם A={'ab' 2 [] ones(3)} A = 'ab' [2] [] [3x3 double] E34 = cell(3,4) E34 = [] [] [] יצירה ע"י ציון האיברים, מוקפים בסוגריים מסולסלים {} אתחול מערך תאים nxm שכל איבריו הם מערך ריק: A(4) [3x3 double] בחירת תאים מתוך המערך: כמו במערכים רגילים. התוצאה היא תא או מערך תאים. בחירת תא בודד: A(2:end) [2] [] [3x3 double] בחירת מספר תאים עמ' מתוך 7
[A ; E34] 'ab' [2] [] [3x3 double] [] [] [] AE(:,3) = [] 'ab' [2] [3x3 double] AE(2,2) = {6:9} 'ab' [ 2] [3x3 double] [] [x4 double] [] AE{,} ab AE{,}(2) b AE{4,2} = {'text' ; 'string'} 'ab' [ 2] [3x3 double] [] [x4 double] [] [] {2x cell } [] AE{,}() = 'A' 'Ab' [ 2] [3x3 double] [] [x4 double] [] [] {2x cell } [] C = {'a' } C2 = {'b' 2} C3 = {C C2} C4 = [C C2] var_mat = cell2mat(var_cell) Cmat = {,2:5 ; (6:9)' eye(4)} Cmat = [ ] [x4 double] [4x double] [4x4 double] cell2mat(cmat) 2 3 4 5 6 7 8 9 שרשור: כמו במערך רגיל. מחיקת תאים: כמו במערך רגיל. החלפת תא: כמו במערך רגיל. יש להגדיר את התוכן המחליף כתא! גישה לתוכן של תא (בודד): ע"י {} גישה לחלק מתוכן של תא: החלפת תוכן של תא: שינוי חלק מתוכן של תא: תרגיל: נתונים המשתנים: מה ההבדל בין הפקודה לפקודה: המרה ממערך תאים למערך רגיל: אפשרית רק אם: תוכן התאים אינו מערך תאים התוכן כולל איברים מסוג אחיד (מספר או תו.) המימדים מתאימים לשרשור. עמ' 2 מתוך 7
קריאה וכתיבה של קבצי אקסל קריאת קובץ אקסל num xlsread(fname); nums=xlsread('squarewave.csv'); nums(:4,:) -.3 -.4.4 -.3 -.96.4 -.3 -.96 -.4 -.3 -.92 [nums,texts] = xlsread(fname); [nums,texts]=xlsread('squarewave.csv'); texts text 3 cell array 'time' 'Vin' 'Vout' [nums,texts,raw] = xlsread(fname); [nums,texts,raw]=xlsread('squarewave.csv'); raw(:4,:) 4 3 cell array 'time' 'Vin' 'Vout' [-.3] [-.4] [.4] [-.3] [-.96] [.4] [-.3] [-.96] [-.4] קריאה של המטריצה הנומרית הגדולה ביותר: נתונים שאינם נומריים מקבלים.NaN קריאת מספרים לחוד וטקסט לחוד הטקסטים הם מערך תאים קריאת התאים הגולמיים כתיבה לקובץ אקסל יש להכין מערך-תאים ולכתוב אותו לקובץ. כל תא במערך נכתב לתא בקובץ אקסל. xlswrite(fname,out_array) אם כל הפלט נומרי, out_array יכול להיות מטריצה נומרית. איבר שהוא NaN ייצר תא ריק בקובץ האקסל. אם יש גם טקסטים, out_array צריך להיות מערך-תאים. כדי לייצר תא ריק בקובץ האקסל, יש ליצור בתא המתאים במשתנה out_array מערך ריק. דוגמא : הפונקציה danalysis מקבלת קלט שם של קובץ בפורמט אקסל. הקובץ כולל טבלה של זמנים וכן שני סיגנלים שנמדדו בזמנים אלה. הפונקציה קוראת את הקובץ ומחשבת מספר נתונים על הזמנים והסיגנלים. הסקריפט dfiles מפעיל את הפונקציה על שני קבצים, יוצר טבלה שמסכמת את הנתונים וכותב אותה לקובץ אקסל. מערכי תאים לטקסט וגרפיקה הוספת טקסט עם מספר שורות לגרף: הטקסטים בתאים מוצגים זה מתחת לזה. צורה זו ישימה לפקודות טקסט, כותרות לצירים וכותרת לגרף. במקרא לגרף, ניתן לציין משתנה אחד עבור כל העקומות: מערך- תאים שבו כל תא הוא מחרוזת-מקרא לעקומה אחת. Txt={'upper line' 'lower line'} title(txt) ylabel(txt) text(x,y,txt) curve_names={'g','g2','combined'} legend(curve_names) עמ' 3 מתוך 7
dshow2ways('sinewave.csv'); Vout signals Two ways to display signals : upper : versus time, lower : parametric plot 2 Vin Vout - -2 -. -.5.5. time.5 דוגמא 2: הפונקציה dshow2ways מקבלת קלט שם של קובץ בפורמט אקסל. הקובץ כולל טבלה של זמנים וכן שני סיגנלים שנמדדו בזמנים אלה. הפונקציה קוראת את הקובץ ומציגה את הסיגנלים פעמיים, על שתי מערכות צירים: פעם אחת - שני הסיגנלים כפונקציה של הזמן. פעם שניה - סיגנל שני כפונקציה של סיגנל ראשון. המקרא וכותרות הצירים נלקחים מכותרות העמודות שנקראו מקובץ האקסל. כמו-כן הפונקציה מחזירה את המספרים ואת הכותרות שנקראו מן הקובץ. -.5 - -.5 - -.5.5.5 Vin מבנים structures מבנה structure הוא "משתנה מקובץ" כלומר אוסף של משתנים תחת שם אחד. המשתנים בתוך ה- structure נקראים שדות. כמו למשתנים, לכל שדה יש שם וערך. דוגמא אפשרית למבנה: תוכן שם שדה experiment מטריצה נומרית data מערך-תאים (עמודה אחת, 3 איברים) עם האיברים הבאים: fnames 2 3 מערך ריק comments סקלר לוגי processed מבנה עם השדות הבאים: parameters סקלר נומרי v מערך נומרי חד-ממדי T method סוגי המשתנים בדוגמא למעלה אינם מחייבים, וגם אחרי שניתן ערך לשדה מסוים, ניתן להחליפו בערך מסוג אחר ומימד אחר. לדוגמא ניתן להחליף את הסקלר הלוגי בשדה processed ב. הוא מערך שכל האיברים שבו הם מבנים בעלי אותם שדות. שמות השדות (ומספר מערך מבנים structure array השדות) זהים, אבל אין קשר בין תוכן שדה עם שם מסוים באיברים שונים. למשל בדוגמא שלמעלה, באיבר אחד השדה processed יכול להיות ובאיבר אחר סקלר נומרי. עמ' 4 מתוך 7
יצירת מבנים וטיפול בהם מבנה בודד מציינים שדה ע"י נקודה בין שם המשתנה לשם השדה: structure_name.field_name יצירת מבנה ע"י השמה לשדות: השמה לשדה הופכת משתנה ל- structure. השמה לשדה שאינו קיים ב- structure קיים מוסיפה לו שדה. יצירת מבנה ע"י פקודה: הארגומנטים value2,value הם מחרוזות תווים שמציינים את שמות השדות. גישה לשדה שליפת תוכן חלק מן התוכן שינוי תוכן של שדה (במקרה זה, מחיקת השורה הראשונה) קבלת מידע על מבנים האם המשתנה הוא מבנה רשימת השדות במבנה מתקבל מערך תאים של שמות השדות האם קיים שדה fieldname במבנה S. מתקבל סקלר לוגי. אילו מן השמות במערך התאים C הם שדות במבנה S. isfield(s,names) מתקבל מערך לוגי. clear all s.indx = indx: data: [3x3 double] s.title = 'with dog' indx: data: [3x3 double] s.data = rand(3) indx: data: [3x3 double] Strct=struct(field,value,field2,value2...) Addr = struct('street','narkisim','number',23) Addr = street: 'Narkisim' number: 23 structure_name.field_name s.indx s.title(:4) with s.data(,:)=[] indx: data: [2x3 double] isstruct(var_name) fieldnames(var_struct) fieldnames(s) 'indx' 'title' 'data' isfield(s, 'fieldname') isfield(s,c) names={'indx','tmp','data'} name 'indx' 'tmp' 'data' עמ' 5 מתוך 7
מערכי מבנים יצירת מערך מבנים ע"י השמה לשדות: השמה של מבנה לתוך איבר n במערך (שלא קיים) יוצרת מערך של n מבנים, שלכולם שדות כמו למבנה זה. גישה לשדה במערך מבנים: גישה לשדה במבנה אחד לדוגמא: שליפת תוכן שדה מכמה מבנים במערך: מתקבל מערך תאים כאשר תוכן השדה ממבנה n נמצא בתא מס' n. השמה לשדה של איבר בתוך מערך שלא קיים יוצרת מערך עד וכולל האלמנט, כאשר לכל האיברים יש שדה זה. ערך ברירת המחדל לכל השדות שלא אותחלו הוא מערך ריק. השמה לשדה שאינו קיים במערך מבנים קיים מוסיפה שדה זה לכל האיברים במערך. אתחול מערך ע"י פקודה: השמת מבנה לתוך איבר במערך שלא קיים, יוצרת מערך של מבנים עם שמות שדות זהים למבנה זה (ותוכן המבנים מאותחל למערך ריק). אם לפחות אחד מן הארגומנטים value הוא מערך תאים, יתקבל מערך מבנים מאותו מימד כמו מערך התאים, כאשר תוכן השדה המתאים נלקח ממערך התאים ו"מפוזר" בין איברי המערך. sarray(5) = s sarray = x5 struct array with fields: indx title data structure_name(n).field_name sarray(3).indx [] {structure_name.field_name} clear all s(5).indx = x5 struct array with fields: indx s(3).title = 'new title' x5 struct array with fields: indx title s(2) indx: [] title: [] Strct=struct(field,value,field2,value2...) As(5) = struct('name',,'name2','txt') A x5 struct array with fields: name name2 Test = struct('name',cell(5,),'name2',[]) Test = 5x struct array with fields: name name2 משיקולי ניהול זיכרון, לא מומלץ להוסיף שדות למערך קיים. עדיף לאתחל מערך מבנים ע"י פקודת.struct קריאת קובץ כללי פקודת importdata קוראת קובץ באחד מן הפורמטים המוכרים ע"י מטלב. הפקודה פועלת רק אם פורמט הקובץ מתאים להגבלות/הנחות של מטלב. המידע מתקבל בצורת structure אשר השדות שלו תלויים בסוג הפורמט. דוגמאות לפורמטים נפוצים: קובץ טקסט המכיל מידע נומרי. ניתן לקרוא גם קובץ שיש בו בשורה הראשונה כותרות טקסטואליות לעמודות. s=importdata('ldgw.txt') data: [463x5 double] textdata: {'t' 'lions' 'deer' 'grass' 'water'} colheaders: {'t' 'lions' 'deer' 'grass' 'water'} עמ' 6 מתוך 7
dshowtext('ldgw.txt'); Data from file : LDGW. txt 6 5 lions deer grass water דוגמא 3: הפונקציה dshowtext קוראת נתונים מקובץ טקסט שיש בו כותרות לעמודות. הכותרות משמשות לציר x ולמקרא העקומות. 4 signals 3 2 2 3 4 5 6 7 8 9 x=importdata('squarewave.csv') x = struct with fields: data: [ 3 double] textdata: {'time' 'Vin' 'Vout'} colheaders: {'time' 'Vin' 'Vout'} x.textdata 3 cell array 'time' 'Vin' 'Vout' v = importdata('wav\f.wav') v = struct with fields: data: [4756 double] fs: 8 t = (:length(v.data))/v.fs; plot(t,v.data) axis tight t גיליון אקסל או קובץ CSV תרגיל: מהי הקוד שבוחר את הנתון המודגש במבנה x למעלה? קול (אודיו) דגימות תדירות הדגימה שימוש במידע:.5..5 -.5 -. -.5.5.5 2 2.5 3 3.5 4 4.5 5 עמ' 7 מתוך 7